# -*- coding: utf-8 -*-
#
# Python版本请求token的例子
# 使用：
#      python example.py 192.168.1.243:8000
# Author: caiyingyao
# Email: cyy0523xc@gmail.com
# Created Time: 2022-11-18
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKC


def RSAEncrypt(plain_text: str, public_pem: str) -> str:
    """
    使用公钥public_pem对内容plain_text进行rsa加密
    plain_text: 需要加密的明文文本
    public_pem: 公钥字符串
    """
    # 加载公钥
    rsa_key = RSA.import_key(public_pem)

    # 加密
    cipher_rsa = Cipher_PKC.new(rsa_key)
    en_data = cipher_rsa.encrypt(plain_text.encode("utf-8"))  # 加密

    # base64 进行编码
    return base64.b64encode(en_data).decode()


if __name__ == '__main__':
    import sys
    import time
    import json
    import requests

    # 测试使用的用户名
    # TODO 根据实际进行修改
    username = "admin"

    # 公钥字符串，从系统“公私钥管理”获取到自己的公钥字符串，和username是配对的
    # 注意字符串前后不要留空格或者换行符
    # TODO 根据实际进行修改
    public_pem = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq73m80px1jTDJ/YH/D2kGeGG0
U/+oED+aHtJfIHF1r9xIzYGIQVJL+MOvRgSMC3w4P2feGUzeC0kGyL65IAYWkOTl
vQbPSw975PXRMM7wne/L0w/cMu1ULumKec8JLptpknpENHHERzZF1MvzrKIBqXjF
3Aa0lk0M1aOT9z6hnQIDAQAB
-----END PUBLIC KEY-----"""

    # 请求token需要的参数字典
    en_params = {
        "username": username,      # 对应抽取系统的用户名，该用户在抽取系统已经开启公钥私钥登陆
        "time": int(time.time()), # 生成token的时间点（服务器端根据这个来校验是否过期）
        "external_uid": None        # 在第三方系统的用户ID，可以为空
    }
    # 加密前的明文字符串：将参数生成json字符串
    plain_text = json.dumps(en_params)
    # RSA加密算法：公钥是public_pem将明文文本plain_text生产加密字符串，并转成base64格式
    # 该加密字符串就是接口所需要的encrypt参数的值
    encrypt_str = RSAEncrypt(plain_text, public_pem)  # 即为此接口的encrypt字段
    print("加密字符串：", encrypt_str)

    # post请求参数
    body = {
        "username": username,    # 这个用户名要跟en_params中的用户名一致
        "encrypt": encrypt_str  # 前面生成的加密字符串
    }
    url = "http://%s/api/v1/user/token/generate" % sys.argv[1]
    print("开始请求接口......", url)
    resp = requests.post(url, json=body)
    # 打印状态码及响应数据，如果异常，可以从此看到异常信息
    print("接口响应状态码：", resp.status_code, resp.content)

    # 打印接口请求到的token
    print("接口返回值：", resp.json())
